package com.cskaoyan.javase.oop3._1interface._4example.controller.impl;

import com.cskaoyan.javase.oop3._1interface._4example.controller.IGoodsOperation;
import com.cskaoyan.javase.oop3._1interface._4example.dao.IGoodsOperationDao;
import com.cskaoyan.javase.oop3._1interface._4example.dao.impl.IGoodsOperationDaoImpl;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;

/**
 * 该实现类对象,对外提供业务逻辑的处理操作
 *
 * 该层的某些功能实现需要直接和数据源进行交互了,但是该层对象不能和数据源交互
 * 该层仅对外提供业务逻辑的操作
 * 所以该层完成数据处理,需要依赖于dao层对象
 *
 * @since 11:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsOperationImpl implements IGoodsOperation {

    private IGoodsOperationDao iod = new IGoodsOperationDaoImpl();

    /**
     * 该方法需要将仅装有商品对象的数组返回
     *
     * @return com.cskaoyan.javase.oop3._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 11:14
     */
    @Override
    public Goods[] getAllRealGoods() {
        /*
            这里可以选择先注释掉,然后写完dao层代码,再来调用方法
            但这种方式不推荐
            实际写代码,可以先假设这个方法,这个功能已经实现了
            直接"."调用这个不存的方法
            然后根据alt+回车 idea的提示创建并写其他功能的实现
         */
        return iod.getAllRealGoods();
    }

    /**
     * 找到一个数据源数组的null位置,将一个新的商品对象插入
     * 返回值:
     *      0: 表示成功了
     *      1: 失败了,但原因是id重复了
     *      2: 失败了,但原因是数组满了
     *
     * @param id 被插入商品的id
     * @param name 被插入商品的name
     * @param price 被插入商品的price
     * @param brand 被插入商品的品牌
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 11:33
     */
    @Override
    public int insertGoods(int id, String name, double price, String brand) {
        /*
            我们在开发中写代码,写一个方法时,可以通过假设的方式的
            先完成一个方法的逻辑
            然后再完成其中的分支逻辑
            为了更有条理的写代码,不要东写一块,西写一块

         */
        // 1.根据参数创建对应的商品对象
        Goods goodsInsert = new Goods(id, name, price, brand);
        // 2.判断id是否重复,重复就不进行插入了
        /*
            id要么重复,要么就不重复
            假设:
                重复返回true
                不重复返回false
         */
        if (iod.judgeIdExist(id)) {
            return 1;
        }
        // 代码执行到这里,说明id一定不重复,所以直接考虑进行插入,如果失败说明数组满了
        // 假如数组满了失败返回true,数组有位置插入成功返回false
        if (iod.insertGoodsIdNotRepeat(goodsInsert)) {
            return 2;
        }
        // 如果没有返回2,数组没有满,说明就插入成功了
        return 0;
    }
}
